Nextflow のローカル開発環境のために Docker コンテナを利用してみてわかったこと
Amazon Omics の検証ために Nextflow のパイプラインの動作確認環境を手元に用意したくなりました。ローカル PC に Nextflow を直接インストールしたくはなかっため、Docker コンテナでnextflow
コマンドを実行してみてわかったことを整理しました。
確認結果
- Nextflow をインストールするならホストサーバーへ直接インストールのがベターな構成
- Nextflow 自体を Docker コンテナで実行すると同じイメージ内に必要なバイオインフォマティクスのツール類もインストールしておく必要があった
- Nextflow だけインストールされた Docker コンテナではチュートリアルのパイプラインの動作確認には利用できた
Nextflow のローカル開発環境を作成する
Docker コンテナでローカル開発環境を作成します。まずは提供されているコンテナイメージの確認からはじめます。
Nextflow 最新バージョン確認
GitHub のリリースノートから最新バージョンを確認できます。現時点の最新は23.04.1
でした。
Releases · nextflow-io/nextflow
コンテナイメージ取得先
ECR Public Gallery を採用しました。コンテナイメージのリポジトリは各所見回ってきた結果を共有します。
Docker Hub
最新の23.04.1
のイメージがアップされていました。
nextflow/nextflow Tags | Docker Hub
ゲストユーザーの Pull レートリミットのことを考えたくはないため採用は見送りました。
For anonymous users, the rate limit is set to 100 pulls per 6 hours per IP address. For authenticated users, it’s 200 pulls per 6 hour period. Users with a paid Docker subscription get up to 5000 pulls per day. For anonymous users, the rate limit is set to 100 pulls per 6 hours per IP address. For authenticated users, it’s 200 pulls per 6 hour period. Users with a paid Docker subscription get up to 5000 pulls per day.
Biocontainers
本命だと考えていた Biocontainers にアップされているイメージの最新は22.10.6
でした。Nextflow のアップデートに追従されていないため採用を見送りました。
ECR Public Gallery
Biocontainers のクローンだと思っていた ECR Public Gallery なのですが Nextflow 23.04.1
がアップされていました。今回は ECR Public Gallery のイメージを採用しました。
docker-compose の作成
ローカルディレクトリをコンテナへマウントしてnextflow
コマンドを実行したかったため簡単な docker-compose.yaml を用意しました。
- コンテナイメージは自前で手を入れずに素の Nextflow のイメージを利用しています
command
で何かコマンドを走らせないとコンテナが起動してもすぐに停止してしまうため対策しています
version: '3' services: app: image: public.ecr.aws/seqera-labs/nextflow:23.04.1 volumes: - .:/workspace:cached working_dir: /workspace tty: true command: > /bin/bash -c " pwd /bin/bash "
実行してみる
Nextflow のコンテナを起動しコンテナ内でnextflow
コマンドを使ってみます。
$ docker-compose up -d $ docker-compose exec app bash
動作確認用に Hello world を実行してみました。正常に動作しています。
# nextflow run hello N E X T F L O W ~ version 23.04.1 Pulling nextflow-io/hello ... downloaded from https://github.com/nextflow-io/hello.git Launching `https://github.com/nextflow-io/hello` [trusting_bohr] DSL2 - revision: 1d71f857bb [master] executor > local (4) [00/ee9350] process > sayHello (4) [100%] 4 of 4 ✔ Hello world! Ciao world! Bonjour world! Hola world!
Nextflow のワークフローの動作確認したいためチュートリアルに従い実行してみます。
Get started — Nextflow 23.04.1 documentation
チュートリアルのワークフローをコピペしtutorial.nf
を作成しました。
params.str = 'Hello world!' process splitLetters { output: path 'chunk_*' """ printf '${params.str}' | split -b 6 - chunk_ """ } process convertToUpper { input: path x output: stdout """ cat $x | tr '[a-z]' '[A-Z]' """ } workflow { splitLetters | flatten | convertToUpper | view { it.trim() } }
定義した2つのプロセスが走り実行結果を出力できました。
bash-4.2# nextflow run tutorial.nf N E X T F L O W ~ version 23.04.1 Launching `tutorial.nf` [ecstatic_brenner] DSL2 - revision: 7ed0e799f3 executor > local (3) process > splitLetters [100%] 1 of 1 ✔ [d7/5e4656] process > convertToUpper (1) [100%] 2 of 2 ✔ WORLD! HELLO
重要なことに気がつく
Nextflow のローカル開発環境が準備できたので Nextflow のワークフローの書き方などのお作法を調べていました。
バイオインフォマティクスツールのインストールは Bioconda を使えば比較的楽に導入できるとはいえ、各ツールは再現性担保のためにもイミュータブルなコンテナを利用して管理、実行したいと考えていました。
その場合、ワークフローには以下の様に記述すればコンテナで実行できるとドキュメントに書いてありました。
Containers — Nextflow 23.04.1 documentation
process { withName:foo { container = 'image_name_1' } withName:bar { container = 'image_name_2' } } charliecloud { enabled = true }
ここで疑問
Nextflow を管理しているのはコンテナ、各種ツールを実行するためにコンテナからコンテナを呼んで別に起動させて動くのか?動いてもその構成が本当に正しいのか?と疑問になりました。
以下のディスカッションを見つけました。こういった構成は理想的ではないので避けた方がいいと言われています。
Even though this is possible (docker within docker), it is not ideal and should be avoided. Nextflow is easy enough to install (it's just a file downloaded) and Java is practically everywhere, so you should be able to run nextflow natively wherever you are ? Running nextflow inside docker container · nextflow-io/nextflow · Discussion #3177
Nextflow のインストールは Java とバイナリさえあれば動くこともあり、ホストのサーバーに Nextflow をインストールするのがベターな構成の様でした。
各種ツールはコンテナで実行したい場合は、ホストにインストールした Nextflow でパイプラインを実行して、そこから各種ツール用のコンテナを呼んで実行すると理解しました。仮に Nextflow 自体をコンテナで実行するなら同じコンテナイメージに必要なツール類をインストールしておく必要があるようです。
オンプレの Nextflow の構成ですとホストに Nextflow も各種ツールもインストール済みでパイプラインから呼んで実行するのが一般的なのではないかと予想しています。
まとめ
- Nextflow をインストールするならホストサーバーへ直接インストールのがベターな構成
- Nextflow 自体を Docker コンテナで実行すると同じイメージ内に必要なバイオインフォマティクスのツール類もインストールしておく必要があった
- Nextflow だけインストールされた Docker コンテナではチュートリアルのパイプラインの動作確認には利用できた
おわりに
ドキュメントを読むだけでは想像力が足りなく Nextflow のパイプライン内の必要要素まで考慮できていませんでした。手を動かしながら学ぶことで Nextflow を少し理解できました。次回は EC2 に Nextflow インストールしてみて動作確認をしてみます。
2023/5/3追記EC2 へインストールも試してみてブログをアップしました。